home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / dbase / dmetd4fp.zip / TERMINAL.PRG < prev   
Text File  |  1991-05-10  |  16KB  |  470 lines

  1. ****************************  TERMINAL.PRG  **********************************
  2. *
  3. * This version runs under:  FoxPro and  DbaseIV
  4. *                           -------------------
  5. *
  6. * This is a sample program which demonstrates a number of the COMETMP library
  7. * commands used to emulate a simple terminal program.
  8. *
  9. * Command keys while in TERMINAL:
  10. *   F2 - Clears the screen
  11. *   F3 - Send a file or group of files(if Ymodem specified for protocol)
  12. *   F4 - Receive a file or files(if Ymodem)
  13. *   ESC - Suspends TERMINAL program or CANCEL an active file transfer
  14. *******************************************************************************
  15. *
  16. SET ESCAPE OFF
  17. SET TALK OFF
  18. SET BELL OFF
  19. SET STATUS OFF
  20. SET SCOREBOARD OFF
  21. SET SAFETY OFF
  22. PUBLIC Event, LF, Msg, ChkCmd, Thresh, Fox, FoxPro, LastMsg, TranHow
  23. PUBLIC ComPort, ComAddr, ComIRQn, ComBaud, ComPrty, ComDBts, ComFlow, ComPhon
  24. TranHow = ' '
  25.  
  26. DEFINE WINDOW TERMINAL FROM 0,0 TO 23,79 none
  27. ACTIVATE WINDOW TERMINAL
  28. CLEAR
  29.  
  30. * Let's find out if COMETMP has been LOADed by CALLing without 1st LOADing
  31. * and trapping any "File was not LOADed" (error 91) errors.
  32. DoLoad = .F.
  33. ON ERROR DoLoad = .T.
  34. CALL COMETMP
  35. IF DoLoad
  36.   IF FoxPro
  37.     Nul = MEMORY()                       && Prevents FPro from LOADing into EMS frame
  38.   ENDIF
  39.     LOAD COMETMP                          && Loads COMETMP.BIN communications library
  40. ENDIF
  41.  
  42. ON ERROR
  43.  
  44. Vers = 'VERS' + SPACE(15)
  45. CALL COMETMP WITH Vers              && Get version #
  46. Vers = SUBSTR(Vers, 6)              && Strip off "VERS " leaving only version info
  47.  
  48. * Display sign-on message
  49. @ 5, 13 TO 13,65 DOUBLE
  50. @ 7,15 SAY 'TERMINAL - A Terminal Emulation Program Using ...'
  51. @ 9,28 SAY '*** ' + Vers + ' ***'
  52. @ 11,15 SAY 'The  B A C K G R O U N D  Communication Library'
  53. Msg = 'COPYRIGHT(c) 1989 by  CompuSolve,  Rockaway, NJ  (201)983-9429'
  54. NULL = ShowOn24(Msg)
  55.  
  56. * Wait loop 
  57. NULL = INKEY(5)
  58.  
  59. CLEAR
  60.  
  61. * Get default settings from TERMINAL.MEM file, if present
  62. IF FILE('TERMINAL.MEM')
  63.  RESTORE FROM TERMINAL ADDITIVE
  64. ELSE
  65.  ComPort = '1'
  66.  ComAddr = 'x03F8'
  67.  ComIRQn = '4'
  68.  ComBaud = '2400 '
  69.  ComPrty = 'E'
  70.  ComDBts = '7'
  71.  ComStop = '1'
  72.  ComFlow = 'N'
  73. *
  74.  ComPhon = SPACE(20)
  75. ENDIF
  76.  
  77. @ 6,8 TO 15, 72
  78. @ 7,10 SAY 'COM Port # (1-5) ?' GET ComPort PICTURE '9' VALID  ComPort $ '12345' ERROR 'VALID CHOICES: 1 - 5'
  79. @ 8,10 SAY "I/O Address (x#### = heX) ?" GET ComAddr VALID .NOT. '?' $ ComAddr ERROR 'NEED TO SPECIFY PORT ADDRESS IN heX OR DECIMAL'
  80. @ 9,10 SAY "IRQ # (2-7) ?" GET ComIRQn PICTURE '9' VALID ComIRQn $ '234567' ERROR 'VALID CHOICES: 2 - 7'
  81. @10,10 SAY "BAUD Rate (300-38400) ?" GET ComBaud PICTURE 'X9999' VALID VAL(ComBaud) >= 300 .AND. VAL(ComBaud) <=38400 ERROR 'VALID CHOICES: 300 - 38400'
  82. @11,10 SAY "Parity (None, Odd or Even) ?" GET ComPrty PICTURE '!' VALID ComPrty $ 'NEO' ERROR 'VALID CHOICES: None, Even or Odd (N, E or O)'
  83. @12,10 SAY "# Data Bits (7 or 8) ?" GET ComDBts PICTURE '9' VALID ComDBts $ '78' ERROR 'VALID CHOICES: 7 or 8'
  84. @13,10 SAY "Flow Control (Xon/xoff, Rts/cts or None) ?" GET ComFlow PICTURE "!" VALID ComFlow $ 'XRN' ERROR 'VALID CHOICES: Xon/Xoff, Rts/cts or None (X, R or N)'
  85. @14,10 SAY "# Stop Bits (1 or 2) ?" GET ComStop VALID ComStop $ '12' ERROR 'VALID CHOICES: 1 or 2'
  86. READ
  87.  
  88. RKey = READKEY()
  89. IF MOD(RKey,256) = 12    && ESCape 
  90.  SUSPEND
  91. ENDIF
  92.  
  93. Msg = 'Enter a telephone # to dial (ENTER = local mode) ?'
  94. NULL = ShowOn24(Msg)
  95. @0,0
  96. * Init variables
  97. ChkCmd = ''
  98.  
  99. * Function keys used to invoke local commands
  100. F1 = 28
  101. F2 = -1                             && Clear Screen
  102. F3 = -2                             && Send file
  103. F4 = -3                             && Receive file
  104. F5 = -4
  105.  
  106. SET FUNC 'F2' TO ''
  107. SET FUNC 'F3' TO ''
  108. SET FUNC 'F4' TO ''
  109. SET FUNC 'F5' TO ''
  110.  
  111. * INKEY() values
  112. Up = 5
  113. Dn = 24
  114. Rgt = 4
  115. Lft = 19
  116. BkSpc = 127
  117.  
  118. * Build OPEN command for COMET
  119. Open = "OPEN COM" + ComPort + "," + ComAddr + "," + ComIRQn + ":" ;
  120.  + ComBaud + "," + ComPrty + "," + ComDBts + ",1," + ComFlow
  121.  
  122. ClsPort = 'CLOSE #' + ComPort          && In case port is being redefined ...
  123. CALL COMETMP WITH ClsPort
  124.  
  125. CALL COMETMP WITH Open                && Now OPEN it for use, that was easy!
  126.  
  127.  
  128. *** Must set FLAVOR if using dBASEIV ***
  129. IF .NOT. FoxPro                    && Must be dBASEIV
  130.     Flavor = 'FLAVOR D4'
  131.     CALL COMETMP WITH Flavor
  132. ENDIF
  133.  
  134. * Now we'll dial a phone#
  135. * Request # to dial 1st
  136. PhoneNo = SPACE(20)
  137. @16,10 SAY "Phone # to Dial (ENTER = direct/local) ?" GET ComPhon
  138. READ
  139.  
  140. *Save settings
  141. SAVE TO TERMINAL ALL LIKE Com????
  142.  
  143.  
  144. IF LEN(TRIM(ComPhon)) > 0
  145.  
  146.  * The ATTD is output to instruct HAYES compatible modems to dial a #
  147.  Dial = "OUTPUT #" + ComPort + ",ATTD" + TRIM(ComPhon) + CHR(13)  && Build OUTPUT command
  148.  CALL COMETMP WITH Dial                && Have modem dial #
  149.  
  150.  * Now, wait till we sense Data Carrier Detect(DCD) from our COM port.
  151.  Msg = "CHECKING FOR MODEM'S DATA CARRIER DETECT (DCD) ..."
  152.  NULL = ShowOn24(Msg)
  153.  Elapsed = 0                         && Simple timer for our DO .. WHILE loop
  154.  LastTime = TIME()                   && Also used for timing purposes
  155.  MdmStat = "MSTAT #" + ComPort + "," + SPACE(25)        && Build MSTAT command
  156.  DO WHILE Elapsed <= 45  .AND. (.NOT. "+DCD" $ MdmStat)
  157.     CALL COMETMP WITH MdmStat         && Get COM port's modem status
  158.  
  159.     IF LastTime <> TIME()           && Test if we need to updated timer count
  160.         Elapsed = Elapsed+1         && Another second has gone by ..
  161.         LastTime = TIME()
  162.         ACTIVATE SCREEN
  163.         @ 24, 66 SAY STR(45-Elapsed,2,0) COLOR W/N  && Display #secs till abort
  164.         ACTIVATE WINDOW TERMINAL
  165.     ENDIF
  166.  
  167.    IF INKEY() = 27
  168.      EXIT
  169.    ENDIF
  170.  
  171.  ENDDO
  172.  
  173.  * Check if we timed out
  174.  IF Elapsed > 45
  175.     ??CHR(7)
  176.     Null = ShowOn24("Sorry, can't establish phone connection. Aborting ...")
  177.     SUSPEND
  178.  ENDIF
  179.  
  180. ENDIF                       && If phone # was entered
  181.  
  182.  
  183.  
  184. * Now that we have a call established we have 2 things to do:
  185. *  1) Check COMETMP's receive buffer and display any incoming characters
  186. *  2) Detect any keystrokes and determine if local command or data to output
  187.  
  188. * #2 is simple, use an ONKEY approach
  189. ON KEY DO GotAkey with .f.
  190.  
  191. SET ESCAPE ON
  192. ON ESCAPE DO GotAKey WITH .t.        && 27 = INKEY() value of ESC key
  193.  
  194.  
  195. CLEAR
  196.  
  197. * Display status message on line 24
  198. Msg = "F2 - Clear | F3 - Send | F4 - Recv | TERM"
  199. LastMsg = Msg
  200. NULL =ShowOn24(Msg)
  201.  
  202. ***************************************************************************
  203. * This is main loop for testing for and displaying any incoming data
  204. DO WHILE .T.
  205.     Inp = "INPUT #" + ComPort + ","  + SPACE(100)  && Build INPUT command
  206.     CALL COMETMP WITH Inp   && Read COMET's COM port data buffer
  207.  
  208.     AmtRetd = VAL(SUBSTR(Inp,10,5))  && Determine how many chars were returned, if any
  209.     COMactive = IIF(AmtRetd > 0, .T., .F.)
  210.  
  211.     IF AmtRetd > 0
  212.       ComData = SUBSTR(Inp, 15, AmtRetd)  && Get just the COM data from <expC>
  213.       ?? ComData
  214.     ENDIF
  215.  ENDDO
  216.  
  217. ***************************************************************************
  218.  
  219. ***************************** GotAKey *************************************
  220. * Anytime a key gets pressed, we jump here
  221. *
  222. PROCEDURE GotAKey
  223. PARAMETERS EscKey
  224.  
  225. ON KEY                     && Disable ON KEY & ON ESCAPE
  226. ON ESCAPE
  227.  
  228. IF EscKey
  229.  Key = 27
  230. ELSE
  231.  Key = INKEY()
  232. ENDIF
  233.  
  234. DO CASE                     && Decide whether key is data to output or local command
  235.     CASE Key > 0 .AND. Key <> 27    && data to output ?
  236.         IF .NOT. 'ACTIVE' $ ChkCmd .OR. TranHow = 'A'   && Output if: no xfers active  OR  ASEND/ARECV active
  237.             Output = "OUTPUT #" + ComPort + "," + CHR(Key)   && Build OUTPUT command
  238.             CALL COMETMP WITH Output          && Output char to COM port
  239.         ELSE
  240.             CLEAR
  241.             ?? CHR(7)
  242.             @ 4,0 TO 12,76 DOUBLE
  243.             @ 6,2 SAY "Sorry but we're busy " + event + "ing a file now!"
  244.             @ 7,2 SAY "But, that fact that I can display this alert box "
  245.             @ 8,2 say "proves COMET is running in the background."
  246.             @ 9,2 say "Hit the 'D' key and I'll do a !DIR command in DOS."
  247.             @10,2 say